load & initialize

load、initialize方法在平时的项目真的说实话压根就没怎么用过,唯一有印象的是在Runtime的Method Swilzzing的作用下在Cagetory中有定义过load方法。粗咯整理以下几点。

+ (void)load;

####作用:

  • 在整个文件被加载到运行时,在 main 函数调用之前被 ObjC 运行时调用的钩子方法。相当于对类进行了某种程度的初始化操作,用来判断子类或分类是否已经正确载入系统,且能够被正常使用。

####特点:

  • 该方法对于加入运行期系统的每个类及分类来说,必定会调用此方法,而且仅调用一次。

  • 如果分类和其所属的类都定义了load方法,则优选调用类里面的在调用分类中的。这里有点要注意类中和分类中的load方法是都会被调用的

  • 执行子类中的load方法之前,必定会先执行所有超类中的load方法。有依赖库的也优先于子类。

####注意点:

  • load方法不遵从继承规则,即某个类没有实现load方法,是不会调用超类的load方法的。

  • 在load方法中使用其他类是不完全的,因为无法确定其他类的load方法是否已经加载完毕。

####实现步骤

  • 首页是判断当前类中是否存在load方法,因为load方法不遵从继承规则,所以如果当前类没有实现load方法就不用在继续。

  • 存在load方法就调用当前类的父类的load方法,父类如果存在分类的话也会调用。

  • 父类的load方法都调用完后在调用当前类的方法,如果当前类有分类就等当前类中的load方法调用完毕后在调用分类中的load方法。

+ (void)initialize;

initialize方法的作用跟load其实是没什么大致区别的,在此只记录一些不同的特性。

####不同特性:

  • 只有当程序调用到了相关的类时,才调用。这点跟load是不同的,load方法是在系统接入时就会整个调用。而并不是在被调用时。

  • initialize方法是遵从继承原则的,当前类为实现initialize方法时,会调用超类的initialize方法。

  • 只有执行initialize方法的那个线程可以操作类或类的实例。优选与线程的执行。